home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Development / General / SpriteWorld 1.0b3 / Examples / SpriteTest / About.c < prev    next >
Text File  |  1993-06-08  |  7KB  |  285 lines

  1. ///--------------------------------------------------------------------------------------
  2. //    About.c
  3. //
  4. //    By:        Tony Myles
  5. //
  6. //    Copyright: © 1993 Tony Myles, All rights reserved worldwide.
  7. ///--------------------------------------------------------------------------------------
  8.  
  9.  
  10. #ifndef __SPRITEWORLD__
  11. #include <SpriteWorld.h>
  12. #endif
  13.  
  14. #ifndef __SPRITELAYER__
  15. #include <SpriteLayer.h>
  16. #endif
  17.  
  18. #ifndef __SPRITE__
  19. #include <Sprite.h>
  20. #endif
  21.  
  22. #ifndef __FRAME__
  23. #include <Frame.h>
  24. #endif
  25.  
  26. #ifndef __SPRITEWORLDUTILS__
  27. #include <SpriteWorldUtils.h>
  28. #endif
  29.  
  30. #ifndef __DIALOGUTILS__
  31. #include <DialogUtils.h>
  32. #endif
  33.  
  34. #ifndef __SPRITETEST__
  35. #include "SpriteTest.h"
  36. #endif
  37.  
  38. #ifndef __APPLICATION__
  39. #include "Application.h"
  40. #endif
  41.  
  42. #ifndef __ABOUT__
  43. #include "About.h"
  44. #endif
  45.  
  46.  
  47. extern SpriteTestPtr gSpriteTestP;
  48.  
  49.  
  50.  
  51. ///--------------------------------------------------------------------------------------
  52. // DisplayAboutBox
  53. ///--------------------------------------------------------------------------------------
  54.  
  55. void DisplayAboutBox(void)
  56. {
  57.     OSErr err;
  58.     GrafPtr savePort;
  59.     DialogPtr aboutDialogP;
  60.     SpriteWorldPtr spriteWorldP = NULL;
  61.     SpriteLayerPtr spriteLayerP = NULL;
  62.     SpritePtr earthSpriteP = NULL, shadowSpriteP = NULL;
  63.     Rect itemRect, moveBoundsRect;
  64.     short itemHit;
  65.  
  66.     aboutDialogP = GetNewDialog(kAboutDialogID, NULL, (WindowPtr)-1L);
  67.     
  68.     if (aboutDialogP != NULL)
  69.     {
  70.         GetPort(&savePort);
  71.         SetPort(aboutDialogP);
  72.  
  73.             // create the sprite world
  74.         err = SWCreateSpriteWorldFromWindow(&spriteWorldP, (CWindowPtr)aboutDialogP, NULL);
  75.     
  76.         if (err == noErr)
  77.         {    
  78.                 // create the sprite layer
  79.             err = SWCreateSpriteLayer(&spriteLayerP);
  80.         }
  81.  
  82.         if (err == noErr)
  83.         {
  84.             err = SWCreateSpriteFromCIconResource(&earthSpriteP, NULL, kEarthCIconID, 1, kRegionMask);
  85.         }
  86.  
  87.         if (err == noErr)
  88.         {
  89.             err = SWCreateSpriteFromCIconResource(&shadowSpriteP, NULL, kShadowCIconID,
  90.                                                             kNumberOfShadowFrames, kRegionMask);
  91.         }
  92.  
  93.         if (err == noErr)
  94.         {
  95.             shadowSpriteP->userData = (long)earthSpriteP;
  96.  
  97.             SWAddSprite(spriteLayerP, shadowSpriteP);
  98.             SWAddSprite(spriteLayerP, earthSpriteP);
  99.             SWAddSpriteLayer(spriteWorldP, spriteLayerP);
  100.  
  101.             GetDItemRect(aboutDialogP, 4, &itemRect);
  102.             moveBoundsRect = aboutDialogP->portRect;
  103.             moveBoundsRect.bottom = itemRect.top - (kMaxSpeed / 2);
  104.  
  105.                 // set the sprite’s movement characteristics
  106.             SWSetSpriteMoveBounds(earthSpriteP, &moveBoundsRect);
  107.             SWSetSpriteMoveDelta(earthSpriteP, 0, kInitialSpeed);
  108.             SWSetSpriteMoveProc(earthSpriteP, EarthMoveProc);
  109.             SWSetSpriteMoveTime(earthSpriteP, 55);
  110.             SWSetSpriteMoveTime(shadowSpriteP, -1);        // never move
  111.             SWSetSpriteFrameTime(shadowSpriteP, 0);
  112.             SWSetSpriteFrameRange(shadowSpriteP, 0, 2);
  113.             SWSetSpriteFrameProc(shadowSpriteP, ShadowFrameProc);
  114.             SWSetCurrentFrameIndex(shadowSpriteP, 2);
  115.             SWSetSpriteMoveBounds(shadowSpriteP, &moveBoundsRect);
  116.  
  117.                 // set the sprite’s initial location
  118.             SWSetSpriteLocation(shadowSpriteP, itemRect.left, itemRect.top);
  119.             GetDItemRect(aboutDialogP, 5, &itemRect);
  120.             SWSetSpriteLocation(earthSpriteP, itemRect.left, itemRect.top);
  121.  
  122.             ((WindowPeek)aboutDialogP)->refCon = (long)spriteWorldP;
  123.  
  124.             ShowWindow(aboutDialogP);
  125.             SetPort(aboutDialogP);
  126.             DrawDialog(aboutDialogP);
  127.             EraseRect(&itemRect);
  128.             OutlineDefaultButton(aboutDialogP, ok);
  129.             ValidRect(&aboutDialogP->portRect);
  130.  
  131.             SWLockSpriteWorld(spriteWorldP);
  132.  
  133.             CopyBits(&aboutDialogP->portBits,
  134.                         spriteWorldP->backFrameP->framePix.bitMapP,
  135.                         &aboutDialogP->portRect,
  136.                         &aboutDialogP->portRect,
  137.                         srcCopy, NULL);
  138.  
  139.             do
  140.             {
  141.                 ModalDialog(AboutDialogFilter, &itemHit);
  142.             } while (itemHit != ok);
  143.  
  144.  
  145.             SWUnlockSpriteWorld(spriteWorldP);
  146.         }
  147.  
  148.         DisposeDialog(aboutDialogP);
  149.  
  150.         if (earthSpriteP != NULL)
  151.             SWDisposeSprite(earthSpriteP, true);
  152.  
  153.         if (shadowSpriteP != NULL)
  154.             SWDisposeSprite(shadowSpriteP, true);
  155.  
  156.         if (spriteLayerP != NULL)
  157.             SWDisposeSpriteLayer(spriteLayerP);
  158.  
  159.         if (spriteWorldP != NULL)
  160.             SWDisposeSpriteWorld(spriteWorldP);
  161.  
  162.         SetPort(savePort);
  163.  
  164.         if (err != noErr)
  165.         {
  166.             ErrorAlert(err, kUnknownErrorStringIndex);
  167.         }
  168.     }
  169.     else
  170.     {
  171.         ErrorAlert(ResError(), kCantFindResourceStringIndex);
  172.     }
  173. }
  174.  
  175.  
  176. ///--------------------------------------------------------------------------------------
  177. // EarthMoveProc
  178. ///--------------------------------------------------------------------------------------
  179.  
  180. SW_PASCAL void EarthMoveProc(
  181.     SpritePtr srcSpriteP,
  182.     Point* spritePoint)
  183. {
  184.         // gravity
  185.     if (srcSpriteP->vertMoveDelta < (short)kMaxSpeed)
  186.         srcSpriteP->vertMoveDelta++;
  187.  
  188.         // bounce
  189.     if (srcSpriteP->destFrameRect.bottom > srcSpriteP->moveBoundsRect.bottom)
  190.     {
  191.         srcSpriteP->vertMoveDelta = -srcSpriteP->vertMoveDelta;
  192.         
  193.         spritePoint->v = srcSpriteP->moveBoundsRect.bottom -
  194.             (srcSpriteP->curFrameP->frameRect.bottom - srcSpriteP->curFrameP->frameRect.top);
  195.     }
  196. }
  197.  
  198.  
  199. ///--------------------------------------------------------------------------------------
  200. // ShadowFrameProc
  201. ///--------------------------------------------------------------------------------------
  202.  
  203. SW_PASCAL void ShadowFrameProc(
  204.     SpritePtr srcSpriteP,
  205.     FramePtr curFrameP,
  206.     long* curFrameIndex)
  207. {
  208.     SpritePtr earthSpriteP = (SpritePtr)srcSpriteP->userData;
  209.     short distanceFromTop = earthSpriteP->destFrameRect.top - srcSpriteP->moveBoundsRect.top;
  210.     short height = srcSpriteP->moveBoundsRect.bottom - srcSpriteP->moveBoundsRect.top;
  211.  
  212.     *curFrameIndex = (long)((distanceFromTop * 3) / height);
  213.  
  214.         // lets not index past the last frame!
  215.         // (even though SpriteWorld will not allow it to happen)
  216.     if (*curFrameIndex > 2L) *curFrameIndex = 2L;
  217. }
  218.  
  219.  
  220. ///--------------------------------------------------------------------------------------
  221. // AboutDialogFilter
  222. ///--------------------------------------------------------------------------------------
  223.  
  224. pascal Boolean AboutDialogFilter(
  225.     DialogPtr aboutDialogP,
  226.     EventRecord *event,
  227.     short *itemHit)
  228. {
  229.     Boolean eventHandled = false;
  230.     SpriteWorldPtr spriteWorldP = (SpriteWorldPtr)((WindowPeek)aboutDialogP)->refCon;
  231.  
  232.     switch (event->what)
  233.     {
  234.         case nullEvent:
  235.         {
  236.                 // run the about box animation
  237.             SWProcessSpriteWorld(spriteWorldP);
  238.             SWAnimateSpriteWorld(spriteWorldP);
  239.  
  240.                 // keep the title animation going!
  241.             RunSpriteTest(gSpriteTestP);
  242.             break;
  243.         }
  244.  
  245.         case keyDown:
  246.         case autoKey:
  247.         {
  248.             char key = (char)(event->message & charCodeMask);
  249.  
  250.             if (key == kReturnChar || (key == kEnterChar))
  251.             {
  252.                 *itemHit = ok;
  253.                 eventHandled = true;
  254.                 ClickDialogButton(aboutDialogP, ok);
  255.             }
  256.  
  257.             break;
  258.         }
  259.  
  260.         case updateEvt:
  261.         {
  262.             if ((DialogPtr)event->message == aboutDialogP)
  263.             {
  264.                 SetPort(aboutDialogP);
  265.                 BeginUpdate(aboutDialogP);
  266.  
  267.                 SWUpdateSpriteWorld(spriteWorldP);
  268.                 
  269.                 EndUpdate(aboutDialogP);
  270.                 eventHandled = true;
  271.             }
  272.             else
  273.             {
  274.                 HandleUpdateEvent((WindowPtr)event->message);
  275.             }
  276.  
  277.             break;
  278.         }
  279.     }
  280.  
  281.     return eventHandled;
  282. }
  283.  
  284.  
  285.